/**
 * Gestionaremos todos los productos del Video-Club.
 * Cada tipo de producto, película y videoclub, tendrá cada uno sus propios géneros. Por lo tanto se controlan en las propias subclases.
 * Cada producto tendrá su ubicacion (tienda ó cajero).
 * Si el producto está en Tienda, ubicacion = null  (el dependiente se encarga de ordenar las peliculas en tienda)
 *
 */

package gestorvideoclub;

import gestorvideoclub.enumeraciones.*;
import gestorvideoclub.jdbc.UbicacionJDBC;
import gestorvideoclub.util.introduceDatos;
import java.util.*;

/**
 *
 * @author Rafa Berral
 */
public abstract class Producto {
    private int id;
    private int codigo;
    private String titulo;
    private ProductoEnum estado;
    private TipoProductoEnum tipo;
    private int edadRecomendada;
    private String descripcion;
    private Double precioCompraProducto;
    private Tarifa tarifa;
    private Ubicacion ubic;
    private Proveedor prov;
    private Franquicia franquicia;//franquicia a la que pertenece el producto

    

    public Producto(){
    }

    public Producto(int cod, String titulo,TipoProductoEnum tipo, ProductoEnum est, String descrip, int edad, double precio, Tarifa t, Ubicacion ub, Proveedor prov, Franquicia f){
        this.codigo = cod;
        this.titulo = titulo;
        this.estado = est;
        this.tipo = tipo;
        this.edadRecomendada = edad;
        this.precioCompraProducto = precio;
        this.tarifa = t;
        this.descripcion = descrip;
        this.ubic = ub;
        this.prov = prov;
        this.franquicia = f;
    }

    public TipoProductoEnum getTipo() {
        return tipo;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public Franquicia getFranquicia() {
        return franquicia;
    }

    public Proveedor getProveedor() {
        return prov;
    }

    public Ubicacion getUbicacion() {
        return ubic;
    }

    public Tarifa getTarifa() {
        return tarifa;
    }

    public int getCodigo() {
        return codigo;
    }

    public int getEdadRecomendada() {
        return edadRecomendada;
    }

    public ProductoEnum getEstado() {
        return estado;
    }

    public Double getPrecioCompraProducto() {
        return precioCompraProducto;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public void setFranquicia(Franquicia franquicia) {
        this.franquicia = franquicia;
    }

    public void setTarifa(Tarifa tarifa) {
        this.tarifa = tarifa;
    }

    public void setTipo(TipoProductoEnum tipo) {
        this.tipo = tipo;
    }


    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public void setEdadRecomendada(int edadRecomendada) {
        this.edadRecomendada = edadRecomendada;
    }

    public void setEstado(ProductoEnum estado) {
        this.estado = estado;
    }

    public void setPrecioCompraProducto(Double precioCompraProducto) {
        this.precioCompraProducto = precioCompraProducto;
    }

    public void setProveedor(Proveedor prov) {
        this.prov = prov;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public void setUbicacion(Ubicacion ubic) {
        this.ubic = ubic;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "\n|| Codigo=" + codigo + " || titulo=" + titulo + " || estado=" + estado.toString() + ""
                + " || tipo=" + tipo.toString() + " || edadRecomendada=" + edadRecomendada + " || descripcion=" + descripcion + " "
                +"\n|| precioCompraProducto=" + precioCompraProducto + " || tarifa=" + tarifa.getNombreTarifa() + " || Precio Alquiler(Por dia): "+tarifa.getPrecio()+""
                + " || ubicacion=" + ubic.getPosicionamiento() + " || prov=" + prov.getNombreEmpresa() + " || franquicia=" + franquicia.getNombre();
    }
   
    
    /*
     * comprueba si el parametro pasado es un estado de producto
     * 
     * @param est   guarda el tipo de producto pasado 
     */
    public boolean compruebaEstadoProducto(String est){
        boolean dev=false;
        for (ProductoEnum p : ProductoEnum.values())
        {
            if(p.toString().equals(est))
            {
                dev=true;
            }
        }
        return dev;
    }
    
    public int recogeCodigoProveedor(){
        System.out.println("Introduce Codigo de Proveedor: ");
        return introduceDatos.introduceEntero2();
    }
    
    public int recogeCodigoFranquicia(){
        System.out.println("Introduce Codigo de Franquicia: ");
        return introduceDatos.introduceEntero2();
    }
    public void recorreListaFranquicia(List<Franquicia> l){
       int cont=1;
       System.out.println("---FRANQUICIAS---");
        for(Franquicia p: l){
            System.out.print(cont+".- ");
            System.out.println(p);
            cont++;
        }
    }
    
    public void recorreListaProveedor(List<Proveedor> l){
        int cont=1;
        System.out.println("---PROVEEDORES---");
        for(Proveedor p: l){
            System.out.print(cont+".- ");
            System.out.println(p);
            cont++;
        }
    }

    /*
     * metodo que devolvemos array del tipo ProductEnum
     * utilizado para mostrarlo en los menus
     */
    public ProductoEnum [] rellenaArrayProductoEnum(){
        int cont=0;
        ProductoEnum [] arrayE = new ProductoEnum[ProductoEnum.values().length];
        for (ProductoEnum p : ProductoEnum.values())
        {
           arrayE[cont]=p;
           cont++;
        }
        return arrayE;
    }
    
    /*
     * metodo que recorre los estados de los productos, ya sean videojuegos o peliculas
     */
    public void recorreEstadoProducto(){
        int cont=1;
        System.out.println("---ESTADOS DE PRODUCTO---");
        for(ProductoEnum p: ProductoEnum.values()){
            System.out.print(cont+".- ");
            System.out.println(p);
            cont++;
        }
    }
    /*
     * metodo que recorre las tarifas de los productos
     */
    public void recorreListaTarifa(List<Tarifa> l){
        int cont=1;
        System.out.println("---TARIFAS ACTIVAS ACTUALMENTE---");
        for(Tarifa p: l){
            System.out.print(cont+".- ");
            System.out.println(p);
            cont++;
        }
    }

    /*
     * metodo utilizado para que elija una opcion en los menus
     */
   public int recogeOpcion(int tamano){
        int eligeOpcion;
        do{
            System.out.println("Elige una opcion entre 1-"+tamano);
            eligeOpcion = introduceDatos.introduceEntero2();
        }while(eligeOpcion>tamano || eligeOpcion<1);
        return eligeOpcion-1;//restamos 1 a la opcion, ya que la lista empieza desde la posicion 0.
    }
   /*
    * metodo que devuelve ubicacion que se le asigna al producto
    */
    public static Ubicacion recogeUbicacion() {
        Ubicacion ubi = new Ubicacion();
        int opcionPos, idUbi;
        do {
            System.out.println("Elija posicionamiento: ");
            System.out.println("1.- Tienda");
            System.out.println("2.- Cajero");
            System.out.println("Elija Opcion: ");
            opcionPos = introduceDatos.introduceEntero2();
        } while (opcionPos < 1 || opcionPos > 2);
        if (opcionPos == 1) {
            ubi.setPosicionamiento("Tienda");
            ubi.setId(1);
            ubi.setColumna(-1);
            ubi.setFila(-1);
            ubi.setOcupado(true);
        } else 
          {
            idUbi = UbicacionJDBC.BuscaIdUbicacionLibre();
            if (idUbi != -1) 
            {
                ubi = UbicacionJDBC.devuelveUbicacion(idUbi);
                ubi.setPosicionamiento("Cajero");
                UbicacionJDBC.insertaUbicacion(ubi);
            } else 
            {
                System.out.println("ERROR! CAJERO LLENO, el producto se asignara a tienda");
                ubi.setPosicionamiento("Tienda");
                ubi.setId(1);
                ubi.setColumna(-1);
                ubi.setFila(-1);
                ubi.setOcupado(true);
            }
        }
        return ubi;
    }
    
    /*
     * metodos abstractos que utilizaremos tanto en peliculas como videojuegos
     */
    public abstract void altaProducto();
    public abstract void bajaProducto();
    public abstract void modificacionProducto();
    public abstract void consultaCodigoProducto();
    public abstract void consultaGeneroProducto();
    public abstract void consultaNombreProducto();
    public abstract boolean compruebaGenero(String gen);
    public abstract void listadoGenero();
    public abstract List tarifasFiltroTipoProductoFecha(TipoProductoEnum producto);
    public abstract void consultaFranquiciaProducto();
    public abstract void consultaProveedorProducto();
    public abstract void consultaAñoProducto(); 
    public abstract void consultaEstadoProducto();

}
